package com.afdor.rws.event.driven.channel.producer;

import com.afdor.rws.core.Callback;
import com.afdor.rws.event.driven.Serialization;
import com.afdor.rws.event.driven.config.EventProducerConfig;
import com.afdor.rws.event.driven.entities.Event;
import com.afdor.rws.event.driven.entities.holder.CallbackEvent;
import com.afdor.rws.event.driven.entities.holder.ResultEvent;
import lombok.NonNull;

import java.util.List;

/**
 * 事件生产者
 *
 * @author 悭梵
 * @date Created in 2018-08-07 15:07
 */
public interface EventProducer {

    /**
     * 初始化
     *
     * @return
     */
    <T extends EventProducer> T init();

    /**
     * 销毁
     */
    void destroy();

    /**
     * 获取配置信息
     *
     * @return
     */
    <C extends EventProducerConfig> C getConfig();

    /**
     * 这是配置信息
     *
     * @param config
     * @param <T>
     * @return
     */
    <T extends EventProducer, C extends EventProducerConfig> T setConfig(C config);

    /**
     * 获取事件源名称
     *
     * @return
     */
    String getEventSourceName();

    /**
     * 设置事件源名称
     *
     * @param eventSourceName
     * @return
     */
    <T extends EventProducer> T setEventSourceName(String eventSourceName);

    /**
     * 返回序列化器-用于事件传输
     *
     * @return
     */
    Serialization getSerialization();

    /**
     * 设置序列化器-用于事件传输
     *
     * @param serialization
     * @return
     */
    <T extends EventProducer> T setSerialization(Serialization serialization);

    /**
     * 通过生产者，发送单条事件
     *
     * @param event 事件对象
     */
    <V> ResultEvent<V> sendEvent(@NonNull Event event);

    /**
     * 发送异步消息
     *
     * @param event
     * @return
     * @throws Exception
     */
    void sendAsyncEvent(@NonNull Event event);

    /**
     * 异步发送消息并成功回调同步处理
     *
     * @param callbackEvent
     * @throws Exception
     */
    <V> void asyncSendEvent(@NonNull CallbackEvent callbackEvent);

    /**
     * 批量发送异步消息
     *
     * @param eventList
     * @return
     */
    void batchSendAsyncEvent(@NonNull List<Event> eventList);

}
